package com.sjz.db;

import com.sjz.service.DBOpenHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;


/****
 * 当应用继承ContentProvider类，并重写该类用于提供数据和存储数据的方法，就可以向其他应用共享其数据
 *内容提供者  需要在设置的包目录或者子包下
 */
public class PersonProvider extends ContentProvider {
	private DBOpenHelper dbOpenHelper;
	//UriMatcher 作用是uri路径匹配用的   参数 不匹配的值-1  UriMatcher.NO_MATCH的值是-1
	private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
	private static final int PERSONS = 1;
	private static final int PERSON = 2;
	//静态代码块  常量   匹配路径
	static{
		// String authority, String path, int code   
		MATCHER.addURI("cn.itcast.providers.personprovider", "person", PERSONS);  //添加
		MATCHER.addURI("cn.itcast.providers.personprovider", "person/#", PERSON);  //删除 
		//# 代码数字  *代表字符   
	}
	
	/****
	 * 不是程序员调用的  是系统调用的
	 * 当内容提供者的实例被创建的时候被调用  
	 * 适合数据库的创建 
	 */
	@Override
	public boolean onCreate() {
		dbOpenHelper = new DBOpenHelper(this.getContext());
		return true;
	}

	 /*****
	  * Uri代表了要操作的数据，Uri主要包含了两部分信息：
	  * 1》需要操作的ContentProvider ，2》对ContentProvider中的什么数据进行操作
	  */
	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		switch (MATCHER.match(uri)) {
		case PERSONS:
			//查询所有  
			return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);

		case PERSON:
			//查询某一条数据
			long rowid = ContentUris.parseId(uri);
			String where = "personid="+ rowid;
			if(selection!=null && !"".equals(selection.trim())){
				where += " and "+ selection;
			}
			return db.query("person", projection, where, selectionArgs, null, null, sortOrder);
		default:
			throw new IllegalArgumentException("this is Unknown Uri:"+ uri);
		}
	}

	 /****
	  * 返回要操作的数据的类型
	  */
	 @Override
	public String getType(Uri uri) {
		 switch (MATCHER.match(uri)) {
		case PERSONS:
			return "vnd.android.cursor.dir/person";  //查询所有数据 vnd.android.cursor.dir是固定的值
		case PERSON:
			return "vnd.android.cursor.item/person";  //vnd.android.cursor.item 查询一条数据固定的值
		default:
			throw new IllegalArgumentException("this is Unknown Uri:"+ uri);
		} 
		 
	} 

	
	/****
	 * 外部应用 对内容提供者进行插入操作 
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();//得到数据库的操作实例  SQLiteDatabase
		//判断uri是否是合法的路径
		switch (MATCHER.match(uri)) {
		//cn.sjz.providers.personprovider/person
		case PERSONS:
			// 第一个参数表名  第二个参数 随意  第三个参数变量值
			long rowid = db.insert("person", "name", values);//主键值    rowid行号 
			//  content://cn.itcast.provides.personprovider/person/10
		//	Uri insertUri =Uri.parse("content://cn.itcast.provides.personprovider/person/"+rowid);
			Uri insertUri = ContentUris.withAppendedId(uri, rowid);  //ContentUris工具类拼接uri  和上一行代码一样
			/***
			 * 发出数据变化通知    uri 发生变化的数据  第二个参数 数据变化的监听者  可以设置成null  
			 * 如果设置值的话，这个值对象 肯定得到监听 
			 */
			this.getContext().getContentResolver().notifyChange(uri, null);
			return insertUri;

		default:  
			//如果路径不对    提示非法路径 
			throw new IllegalArgumentException("this is Unknown Uri:"+ uri);
		}
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		int num = 0;
		switch (MATCHER.match(uri)) {
		case PERSONS:   //1 表示删除所有的数据 
			num = db.delete("person", selection, selectionArgs);
			break;
		case PERSON:   //删除某一条数据
			long rowid = ContentUris.parseId(uri);  //表示从uri中 得到数值 
			String where = "personid="+ rowid;
			if(selection!=null && !"".equals(selection.trim())){
				where += " and "+ selection;   //参数是拼接两个值 一个是请求uri的值  另一个是传入的参数是否有值
			}
			num = db.delete("person", where, selectionArgs);
			break;
		default:
			throw new IllegalArgumentException("this is Unknown Uri:"+ uri);
		}
		return num;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		int num = 0;
		switch (MATCHER.match(uri)) {
		case PERSONS:  
			//更新所有的值
			num = db.update("person", values, selection, selectionArgs);
			break;
		case PERSON:
			//更新具体的某一个值
			long rowid = ContentUris.parseId(uri);
			String where = "personid="+ rowid;
			if(selection!=null && !"".equals(selection.trim())){
				where += " and "+ selection;
			}
			num = db.update("person", values, where, selectionArgs);
			break;
		default:
			throw new IllegalArgumentException("this is Unknown Uri:"+ uri);
		}
		return num;
	}

}
